/*
 Esta biblioteca tiene las fuciones para que puedan probar escribiendo
 y leyendo sectores directamente sobre el disco hasta que logremos
 comunicar los procesos, asi pueden probar si van haciend las cosas bien

 Para utilizar en el codigo primero tienen que usar la funcion
 mapearArchivo() para tener el archivo en memoria y ya despues pueden
 usar tranquilamente las funciones leerSector y escribirSector

 Mas o menos deberia ser algo asi:

 tamanio = tamanioArchivo (FILEPATH);
 map = mapearArchivo (FILEPATH, tamanio);
 escribirSector(map,buffer,1);
 lectura = leerSector(map,1); //Definiendo primero las variables tamanio, map y lectura

 Cualquier duda que tengan pregunten tranquilos
 */

#include "funcionesPPD.h"

int tamanioArchivo (char* filepath)
{
	FILE *punteroDelArchivo;
	int tamanio;

	punteroDelArchivo = fopen(FILEPATH, "rb");
	fseek(punteroDelArchivo,0,SEEK_END);
	tamanio = ftell(punteroDelArchivo);

	return tamanio;
}

char* mapearArchivo(char* filepath, int tamanio)
{

	int fd;
	char* map;

	fd = open(filepath, O_RDWR);
	if (fd == -1)
	{
		perror("Error abriendo el archivo para lectura");
		exit(EXIT_FAILURE);
	}

    map = mmap(NULL,tamanio,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    posix_madvise(map,512,POSIX_MADV_SEQUENTIAL);

    if (map == MAP_FAILED)
    {
    	close(fd);
     	perror("Error al mapear el archivo");
    	exit(EXIT_FAILURE);
    }

    close(fd);
    return map;
}

char* leerSector(char* map, int numSector)
{
	char* sectorALeer;
	char* aux = (char*) malloc (512);

	sectorALeer = numSector * 512 + map;
	memcpy(aux, sectorALeer, 512);
	return aux;
}/*memcpy recibe 3 parametros, el primero es donde se quiere copias
  (la direccion del puntero donde iniciaria el sector), el segundo
   es de donde copio, por eso buscamos la direccion en donde comenzaria
   el sector en el archivo mapeado. El 3° parametro es cuanto queremos copiar
   (en bytes),como siempre van a ser sectores le pusimos 512*/

int escribirSector(char*map, char* buff, int numSector)
{
	int tamanio;
	char* sectorAEscribir;
	sectorAEscribir = (numSector * 512) + map;
	memcpy(sectorAEscribir, buff, 512);
	tamanio = tamanioArchivo (FILEPATH);
	msync (map, tamanio, MS_ASYNC);

	return 0;

}
